home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 10 / FM Towns Free Software Collection 10.iso / ms_dos / tool / conhlp03 / fswchsrc / h3.c < prev    next >
C/C++ Source or Header  |  1995-02-20  |  6KB  |  246 lines

  1. /*
  2.     h3.c
  3.     フリーウェアコレクション コマンドモード ヘルパー
  4.     Version 0.05 writen by calo.
  5.     1994/03/01 1994/08/20 1995/02/20
  6. */
  7.  
  8. #define PROGRAM "fswch"
  9. #ifdef TOWNS
  10. #define VIRSION "\n\tVersion 0.05t  タウンズ専用版 1995/02/20 CopyLeft calo.\n"
  11. #else
  12. #define VIRSION "\n\tVersion 0.05r  MS-DOS汎用版 1995/02/20 CopyLeft calo.\n"
  13. #endif
  14. #define USAGE "\tFree SoftWare Collection helper for ms-dos\n"\
  15.     "\tusage: "PROGRAM" [path|filename] [+n1,n2,...] [-n3,n4,...]\n"\
  16.     "\t\t<n:キーワード番号 +:選択 -:否定選択 >"
  17.  
  18. #define MAIN
  19. #include <stdlib.h>
  20. #include "fswch.h"
  21.  
  22. /* 外部関数 */
  23. char *dispprog( int nprog );        /* 作品名の表示 */
  24. void lookfile( char cm,int no );    /* ファイルの表示 */
  25. void dispkeyword( void );        /* キーワード表示 */
  26. int chekkeyword( void );        /* 作品選択チェック */
  27. void setkeyword( void );        /* 選択キーワード設定 */
  28. void setkf( char *s );            /* キーフラグにセット */
  29. void instl( int no );            /* インストール用バッチ制作 */
  30. int sel_menu( int w, int firstline, char *word[] ); /* 選択メニュー */
  31.  
  32. /* 外部 文字列関数 */
  33. int instr( char a, const char *);    /* 文字列sの文字aの位置 */
  34. int split( char *s, char **str, const char *sep); /* 文字の切り分け */
  35. int strcmp( const char *,const char *);    /* 文字列の比較 */
  36. char *strcpy( char *,const char *);    /* 文字列のコピー */
  37. char *strcat( char *a,const char *b);    /* 文字列の連結 */
  38.  
  39. const char KW_SEP[] = " :\t\r\n";
  40.  
  41. void help( char *s );            /* 使い方 & exit(1) */
  42.  
  43. void main( int argc, char *argv[] ){
  44.     int i,cpro;
  45.  
  46.     /* 変数の初期化 */
  47.     for(i=0;i<PROG_MAX;i++){
  48.         selprog[i]=-1;
  49.     }
  50.     for(i=0;i<KEY_MAX;i++){
  51.         keyword[i][0]=NULL;
  52.         skey[i]=OFF;
  53.     }
  54.     pg = getenv("PAGER"); /* 環境変数 PAGER の取得 */
  55.  
  56.     /* 引数の処理 */
  57.     ckey = 0;
  58.     if(argc>1){
  59.         for(i=1;i<argc;i++) /* 全ての引数について */
  60.         switch(argv[i][0]){ /* 一文字目が */
  61.         case '-' :
  62.             if(instr(argv[i][1],"Hh?")) help(argv[0]);
  63.             setkf(argv[i]);
  64.             break;
  65.         case '+' :
  66.             setkf(argv[i]);
  67.             break;
  68.         default :
  69.             idxfp=fopen(argv[i],"r");
  70.             break;
  71.         }
  72.     }
  73.     if(idxfp==NULL)
  74.         /* ファイルの指定がなければ カレントディレクトリから */
  75.         if((idxfp=fopen("helper.idx","r"))==NULL)
  76.             /* q:\helper.idx */
  77.             if((idxfp=fopen("q:\\helper.idx","r"))==NULL){
  78.                 fputs("helper.idxが 見つからない",stderr);
  79.                 help(argv[0]);
  80.             }
  81.     
  82.     /* 初期化 */
  83. #ifdef TOWNS
  84.     /* padinit(); */
  85.     /* COM を off TRG を on に セットする */
  86. #define PADCTRL 0x04d6
  87.     outp( PADCTRL, 0x0f );
  88. #undef PADCTRL
  89. #endif
  90.     curoff;
  91.  
  92.     {
  93.         char line[85],*str[6];
  94.         int i,j,c;
  95.         fpos_t ptr;
  96.  
  97.         /* helper.idxを一度全部読む */
  98.         cputs("helper.idx 読み込み中\r\n");
  99.  
  100.         /* keyword の取得 */
  101.         kno = 0;
  102.         do{ /* 1文字目が K であるあいだ */
  103.             fgets(line,84,idxfp);
  104.             c = split(line,str,KW_SEP);
  105.             for(i=1;i<c;i++){ /* str[0] はとばす */
  106.                 strcpy(keyword[kno++],str[i]);
  107.             }
  108.         }while(line[0]=='K');
  109.         
  110.         /* indexのセット */
  111.         ino = -1 ; /* ino プリインクリメントのため */
  112.         while( !feof(idxfp)){ /* ファイルの終わりまで */
  113.             fgetpos( idxfp,&ptr ); /* 現在位置 */
  114.             fgets( line,84,idxfp );
  115.             switch (line[0]) {
  116.             case 'P' : /* プログラムタイトル */
  117.                 /* 位置を記憶 */
  118.                 idxptr[++ino] = ptr;
  119.                 break;
  120.             case 'K' : /* keyword */
  121.                 c = split(line,str,KW_SEP);
  122.                 for(j=0;j<kno;j++)
  123.                 for(i=1;i<c;i++)
  124.                     if(strcmp(keyword[j],str[i])==NULL)
  125.                         idxpkey[ino][j]=ON;
  126.                 break;
  127.             default:
  128.                 break;
  129.             } /* switch (line[0]) */
  130.         } /* while( !feof(idxfp)) */
  131.  
  132.         /* 作品選択チェック */
  133.         cpro = chekkeyword();
  134.     }
  135.  
  136.     /* メインループ */
  137.     {
  138.     /* コマンド選択 */
  139.     int cm=-1;
  140.     char cmf = ON;
  141.     char *cmd[] = {
  142.         "キーワードの設定",
  143.         "作品の選択",
  144.         "概要ファイルの表示",
  145.         "ドキュメントの表示",
  146.         "作品インストール",
  147.         "ヘルパー終了",
  148.         ""
  149.     };
  150.         while(cmf){
  151.         char pbf[SELPRG_MAX][85],*pbfp[SELPRG_MAX+1],pbfe[]="";
  152.         for(i=0;i<SELPRG_MAX;i++) pbfp[i]=pbf[i];
  153.         pbfp[SELPRG_MAX+1]=pbfe;
  154.         /* キーワード表示 */
  155.         dispkeyword();
  156.         cprintf("\r\n--- 全部で %d本の作品があります。 ---\r\n",ino+1);
  157.         /* 選択された */
  158.         if(cpro>0)
  159.             cprintf("---  %d本の作品が選択されました。---",
  160.                 cpro);
  161.         else
  162.             cputs("--- 選択はありません。---");
  163.         cputs("\r\n\n");
  164.         if(cm>=0){ /* 現在選択中の 作品 */
  165.             dispprog(selprog[cm]);
  166.         } else cputs(ESC"2K");
  167.         
  168.         switch (sel_menu(3,14,cmd)) { /* コマンド選択 */
  169.         case 0:/* キーワードの設定 */
  170.         /* セットキーワード */
  171.         setkeyword();
  172.         /* 作品選択チェック */
  173.         cpro = chekkeyword();
  174.         cm = -1;
  175.             break;
  176.         case 1:/* 表示 プログラムの選択 */
  177.             cputs("\r\n\n");
  178.             if(cpro<1){
  179.                 cputs("作品の選択がありません。Hit anykey.");
  180.                 getop();
  181.                 break;
  182.             }
  183.             for( i = 0 ; i<cpro; i++){
  184.                 /* if(selprog[i]<0) break; */
  185.                 if( i!=0 && (i%SELPRG_MAX)==0 ){
  186.                     /* if((i+1)==cpro) break; */
  187.  
  188.                 cprintf(ESC_GREEN
  189.                 "--- more program 実行orRET:sellect ---"
  190.                 " あと %d 作品あります。\r\n",cpro-i);
  191.  
  192.                     /* RET or 実行 key */
  193.                     if(instr(getop(),"\x0d\x12")){
  194.                         break;
  195.                     }
  196.                     /*  cputs(ESC"2K\r"); */
  197.                 }
  198.                 strcpy(pbf[i%SELPRG_MAX],dispprog(selprog[i]));
  199.             }
  200.             i--;
  201.             pbf[(i%SELPRG_MAX)+1][0]=NULL;
  202.             clstext();
  203.             cputs(ESC_SKYBULE"========= 作品選択 ==========\r\n");
  204.             if((cm = sel_menu(1,3,pbfp))<0) break;
  205.             cm = cm+(i/SELPRG_MAX)*SELPRG_MAX;
  206.  
  207.         case 2:/* 概要ファイルの表示 */
  208.             cputs(ESC"22;0;f");
  209.             lookfile('g',selprog[cm]);
  210.             break;
  211.         case 3:/* ドキュメントの表示 */
  212.             cputs(ESC"22;0;f");
  213.             lookfile('d',selprog[cm]);
  214.             break;
  215.         case 4:/* copy */
  216.             instl(selprog[cm]);
  217.             break;
  218.         case 5:/* 終了 */
  219.         default:
  220.             {
  221.             char *endp[]={ "終了する","続ける","" };
  222.             cmf = ( sel_menu(2,18,endp)==0 ) ? OFF : ON ;
  223.             }
  224.             break;
  225.         } /* switch */
  226.         } /* while */
  227.     } /* メインループ */
  228.  
  229.     /* 後始末 */
  230.     clstext();
  231.     fclose(idxfp);
  232.     for(i=0;i<kno;i++) skey[i]=SELLECT;
  233.     dispkeyword();
  234.     putch('\r');
  235.     cputs(argv[0]);
  236.     cputs(" 終了");
  237.     curon;
  238. }
  239.  
  240. void help( char *s ){ /* 使い方 & 終了 */
  241.     fputs( s, stderr );
  242.     fputs( VIRSION, stderr );
  243.     fputs( USAGE, stderr );
  244.     exit(1);
  245. }
  246.